home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / xfs / xfs_bmap.h < prev    next >
C/C++ Source or Header  |  2005-10-18  |  13KB  |  380 lines

  1. /*
  2.  * Copyright (c) 2000-2003 Silicon Graphics, Inc.  All Rights Reserved.
  3.  *
  4.  * This program is free software; you can redistribute it and/or modify it
  5.  * under the terms of version 2 of the GNU General Public License as
  6.  * published by the Free Software Foundation.
  7.  *
  8.  * This program is distributed in the hope that it would be useful, but
  9.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11.  *
  12.  * Further, this software is distributed without any warranty that it is
  13.  * free of the rightful claim of any third person regarding infringement
  14.  * or the like.  Any license provided herein, whether implied or
  15.  * otherwise, applies only to this software file.  Patent licenses, if
  16.  * any, provided herein do not apply to combinations of this program with
  17.  * other software, or any other product whatsoever.
  18.  *
  19.  * You should have received a copy of the GNU General Public License along
  20.  * with this program; if not, write the Free Software Foundation, Inc., 59
  21.  * Temple Place - Suite 330, Boston MA 02111-1307, USA.
  22.  *
  23.  * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
  24.  * Mountain View, CA  94043, or:
  25.  *
  26.  * http://www.sgi.com
  27.  *
  28.  * For further information regarding this notice, see:
  29.  *
  30.  * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
  31.  */
  32. #ifndef __XFS_BMAP_H__
  33. #define    __XFS_BMAP_H__
  34.  
  35. struct getbmap;
  36. struct xfs_bmbt_irec;
  37. struct xfs_inode;
  38. struct xfs_mount;
  39. struct xfs_trans;
  40.  
  41. /*
  42.  * List of extents to be free "later".
  43.  * The list is kept sorted on xbf_startblock.
  44.  */
  45. typedef struct xfs_bmap_free_item
  46. {
  47.     xfs_fsblock_t        xbfi_startblock;/* starting fs block number */
  48.     xfs_extlen_t        xbfi_blockcount;/* number of blocks in extent */
  49.     struct xfs_bmap_free_item *xbfi_next;    /* link to next entry */
  50. } xfs_bmap_free_item_t;
  51.  
  52. /*
  53.  * Header for free extent list.
  54.  */
  55. typedef    struct xfs_bmap_free
  56. {
  57.     xfs_bmap_free_item_t    *xbf_first;    /* list of to-be-free extents */
  58.     int            xbf_count;    /* count of items on list */
  59.     int            xbf_low;    /* kludge: alloc in low mode */
  60. } xfs_bmap_free_t;
  61.  
  62. #define    XFS_BMAP_MAX_NMAP    4
  63.  
  64. /*
  65.  * Flags for xfs_bmapi
  66.  */
  67. #define    XFS_BMAPI_WRITE        0x001    /* write operation: allocate space */
  68. #define XFS_BMAPI_DELAY        0x002    /* delayed write operation */
  69. #define XFS_BMAPI_ENTIRE    0x004    /* return entire extent, not trimmed */
  70. #define XFS_BMAPI_METADATA    0x008    /* mapping metadata not user data */
  71. #define XFS_BMAPI_EXACT        0x010    /* allocate only to spec'd bounds */
  72. #define XFS_BMAPI_ATTRFORK    0x020    /* use attribute fork not data */
  73. #define XFS_BMAPI_ASYNC        0x040    /* bunmapi xactions can be async */
  74. #define XFS_BMAPI_RSVBLOCKS    0x080    /* OK to alloc. reserved data blocks */
  75. #define    XFS_BMAPI_PREALLOC    0x100    /* preallocation op: unwritten space */
  76. #define    XFS_BMAPI_IGSTATE    0x200    /* Ignore state - */
  77.                     /* combine contig. space */
  78. #define    XFS_BMAPI_CONTIG    0x400    /* must allocate only one extent */
  79.  
  80. #if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAPI_AFLAG)
  81. int xfs_bmapi_aflag(int w);
  82. #define    XFS_BMAPI_AFLAG(w)    xfs_bmapi_aflag(w)
  83. #else
  84. #define    XFS_BMAPI_AFLAG(w)    ((w) == XFS_ATTR_FORK ? XFS_BMAPI_ATTRFORK : 0)
  85. #endif
  86.  
  87. /*
  88.  * Special values for xfs_bmbt_irec_t br_startblock field.
  89.  */
  90. #define    DELAYSTARTBLOCK        ((xfs_fsblock_t)-1LL)
  91. #define    HOLESTARTBLOCK        ((xfs_fsblock_t)-2LL)
  92.  
  93. #if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_INIT)
  94. void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp);
  95. #define    XFS_BMAP_INIT(flp,fbp)    xfs_bmap_init(flp,fbp)
  96. #else
  97. #define    XFS_BMAP_INIT(flp,fbp)    \
  98.     ((flp)->xbf_first = NULL, (flp)->xbf_count = 0, \
  99.      (flp)->xbf_low = 0, *(fbp) = NULLFSBLOCK)
  100. #endif
  101.  
  102. /*
  103.  * Argument structure for xfs_bmap_alloc.
  104.  */
  105. typedef struct xfs_bmalloca {
  106.     xfs_fsblock_t        firstblock; /* i/o first block allocated */
  107.     xfs_fsblock_t        rval;    /* starting block of new extent */
  108.     xfs_fileoff_t        off;    /* offset in file filling in */
  109.     struct xfs_trans    *tp;    /* transaction pointer */
  110.     struct xfs_inode    *ip;    /* incore inode pointer */
  111.     struct xfs_bmbt_irec    *prevp;    /* extent before the new one */
  112.     struct xfs_bmbt_irec    *gotp;    /* extent after, or delayed */
  113.     xfs_extlen_t        alen;    /* i/o length asked/allocated */
  114.     xfs_extlen_t        total;    /* total blocks needed for xaction */
  115.     xfs_extlen_t        minlen;    /* mininum allocation size (blocks) */
  116.     xfs_extlen_t        minleft; /* amount must be left after alloc */
  117.     char            eof;    /* set if allocating past last extent */
  118.     char            wasdel;    /* replacing a delayed allocation */
  119.     char            userdata;/* set if is user data */
  120.     char            low;    /* low on space, using seq'l ags */
  121.     char            aeof;   /* allocated space at eof */
  122. } xfs_bmalloca_t;
  123.  
  124. #ifdef __KERNEL__
  125.  
  126. #if defined(XFS_BMAP_TRACE)
  127. /*
  128.  * Trace operations for bmap extent tracing
  129.  */
  130. #define    XFS_BMAP_KTRACE_DELETE    1
  131. #define    XFS_BMAP_KTRACE_INSERT    2
  132. #define    XFS_BMAP_KTRACE_PRE_UP    3
  133. #define    XFS_BMAP_KTRACE_POST_UP    4
  134.  
  135. #define    XFS_BMAP_TRACE_SIZE    4096    /* size of global trace buffer */
  136. #define    XFS_BMAP_KTRACE_SIZE    32    /* size of per-inode trace buffer */
  137. extern ktrace_t    *xfs_bmap_trace_buf;
  138.  
  139. /*
  140.  * Add bmap trace insert entries for all the contents of the extent list.
  141.  */
  142. void
  143. xfs_bmap_trace_exlist(
  144.     char            *fname,        /* function name */
  145.     struct xfs_inode    *ip,        /* incore inode pointer */
  146.     xfs_extnum_t        cnt,        /* count of entries in list */
  147.     int            whichfork);    /* data or attr fork */
  148. #else
  149. #define    xfs_bmap_trace_exlist(f,ip,c,w)
  150. #endif
  151.  
  152. /*
  153.  * Convert inode from non-attributed to attributed.
  154.  * Must not be in a transaction, ip must not be locked.
  155.  */
  156. int                    /* error code */
  157. xfs_bmap_add_attrfork(
  158.     struct xfs_inode    *ip,    /* incore inode pointer */
  159.     int                    rsvd);    /* flag for reserved block allocation */
  160.  
  161. /*
  162.  * Add the extent to the list of extents to be free at transaction end.
  163.  * The list is maintained sorted (by block number).
  164.  */
  165. void
  166. xfs_bmap_add_free(
  167.     xfs_fsblock_t        bno,        /* fs block number of extent */
  168.     xfs_filblks_t        len,        /* length of extent */
  169.     xfs_bmap_free_t        *flist,        /* list of extents */
  170.     struct xfs_mount    *mp);        /* mount point structure */
  171.  
  172. /*
  173.  * Routine to clean up the free list data structure when
  174.  * an error occurs during a transaction.
  175.  */
  176. void
  177. xfs_bmap_cancel(
  178.     xfs_bmap_free_t        *flist);    /* free list to clean up */
  179.  
  180. /*
  181.  * Compute and fill in the value of the maximum depth of a bmap btree
  182.  * in this filesystem.  Done once, during mount.
  183.  */
  184. void
  185. xfs_bmap_compute_maxlevels(
  186.     struct xfs_mount    *mp,    /* file system mount structure */
  187.     int            whichfork);    /* data or attr fork */
  188.  
  189. /*
  190.  * Routine to be called at transaction's end by xfs_bmapi, xfs_bunmapi
  191.  * caller.  Frees all the extents that need freeing, which must be done
  192.  * last due to locking considerations.
  193.  *
  194.  * Return 1 if the given transaction was committed and a new one allocated,
  195.  * and 0 otherwise.
  196.  */
  197. int                        /* error */
  198. xfs_bmap_finish(
  199.     struct xfs_trans    **tp,        /* transaction pointer addr */
  200.     xfs_bmap_free_t        *flist,        /* i/o: list extents to free */
  201.     xfs_fsblock_t        firstblock,    /* controlled a.g. for allocs */
  202.     int            *committed);    /* xact committed or not */
  203.  
  204. /*
  205.  * Returns the file-relative block number of the first unused block in the file.
  206.  * This is the lowest-address hole if the file has holes, else the first block
  207.  * past the end of file.
  208.  */
  209. int                        /* error */
  210. xfs_bmap_first_unused(
  211.     struct xfs_trans    *tp,        /* transaction pointer */
  212.     struct xfs_inode    *ip,        /* incore inode */
  213.     xfs_extlen_t        len,        /* size of hole to find */
  214.     xfs_fileoff_t        *unused,    /* unused block num */
  215.     int            whichfork);    /* data or attr fork */
  216.  
  217. /*
  218.  * Returns the file-relative block number of the last block + 1 before
  219.  * last_block (input value) in the file.
  220.  * This is not based on i_size, it is based on the extent list.
  221.  * Returns 0 for local files, as they do not have an extent list.
  222.  */
  223. int                        /* error */
  224. xfs_bmap_last_before(
  225.     struct xfs_trans    *tp,        /* transaction pointer */
  226.     struct xfs_inode    *ip,        /* incore inode */
  227.     xfs_fileoff_t        *last_block,    /* last block */
  228.     int            whichfork);    /* data or attr fork */
  229.  
  230. /*
  231.  * Returns the file-relative block number of the first block past eof in
  232.  * the file.  This is not based on i_size, it is based on the extent list.
  233.  * Returns 0 for local files, as they do not have an extent list.
  234.  */
  235. int                        /* error */
  236. xfs_bmap_last_offset(
  237.     struct xfs_trans    *tp,        /* transaction pointer */
  238.     struct xfs_inode    *ip,        /* incore inode */
  239.     xfs_fileoff_t        *unused,    /* last block num */
  240.     int            whichfork);    /* data or attr fork */
  241.  
  242. /*
  243.  * Returns whether the selected fork of the inode has exactly one
  244.  * block or not.  For the data fork we check this matches di_size,
  245.  * implying the file's range is 0..bsize-1.
  246.  */
  247. int
  248. xfs_bmap_one_block(
  249.     struct xfs_inode    *ip,        /* incore inode */
  250.     int            whichfork);    /* data or attr fork */
  251.  
  252. /*
  253.  * Read in the extents to iu_extents.
  254.  * All inode fields are set up by caller, we just traverse the btree
  255.  * and copy the records in.
  256.  */
  257. int                        /* error */
  258. xfs_bmap_read_extents(
  259.     struct xfs_trans    *tp,        /* transaction pointer */
  260.     struct xfs_inode    *ip,        /* incore inode */
  261.     int            whichfork);    /* data or attr fork */
  262.  
  263. /*
  264.  * Map file blocks to filesystem blocks.
  265.  * File range is given by the bno/len pair.
  266.  * Adds blocks to file if a write ("flags & XFS_BMAPI_WRITE" set)
  267.  * into a hole or past eof.
  268.  * Only allocates blocks from a single allocation group,
  269.  * to avoid locking problems.
  270.  * The returned value in "firstblock" from the first call in a transaction
  271.  * must be remembered and presented to subsequent calls in "firstblock".
  272.  * An upper bound for the number of blocks to be allocated is supplied to
  273.  * the first call in "total"; if no allocation group has that many free
  274.  * blocks then the call will fail (return NULLFSBLOCK in "firstblock").
  275.  */
  276. int                        /* error */
  277. xfs_bmapi(
  278.     struct xfs_trans    *tp,        /* transaction pointer */
  279.     struct xfs_inode    *ip,        /* incore inode */
  280.     xfs_fileoff_t        bno,        /* starting file offs. mapped */
  281.     xfs_filblks_t        len,        /* length to map in file */
  282.     int            flags,        /* XFS_BMAPI_... */
  283.     xfs_fsblock_t        *firstblock,    /* first allocated block
  284.                            controls a.g. for allocs */
  285.     xfs_extlen_t        total,        /* total blocks needed */
  286.     struct xfs_bmbt_irec    *mval,        /* output: map values */
  287.     int            *nmap,        /* i/o: mval size/count */
  288.     xfs_bmap_free_t        *flist);    /* i/o: list extents to free */
  289.  
  290. /*
  291.  * Map file blocks to filesystem blocks, simple version.
  292.  * One block only, read-only.
  293.  * For flags, only the XFS_BMAPI_ATTRFORK flag is examined.
  294.  * For the other flag values, the effect is as if XFS_BMAPI_METADATA
  295.  * was set and all the others were clear.
  296.  */
  297. int                        /* error */
  298. xfs_bmapi_single(
  299.     struct xfs_trans    *tp,        /* transaction pointer */
  300.     struct xfs_inode    *ip,        /* incore inode */
  301.     int            whichfork,    /* data or attr fork */
  302.     xfs_fsblock_t        *fsb,        /* output: mapped block */
  303.     xfs_fileoff_t        bno);        /* starting file offs. mapped */
  304.  
  305. /*
  306.  * Unmap (remove) blocks from a file.
  307.  * If nexts is nonzero then the number of extents to remove is limited to
  308.  * that value.  If not all extents in the block range can be removed then
  309.  * *done is set.
  310.  */
  311. int                        /* error */
  312. xfs_bunmapi(
  313.     struct xfs_trans    *tp,        /* transaction pointer */
  314.     struct xfs_inode    *ip,        /* incore inode */
  315.     xfs_fileoff_t        bno,        /* starting offset to unmap */
  316.     xfs_filblks_t        len,        /* length to unmap in file */
  317.     int            flags,        /* XFS_BMAPI_... */
  318.     xfs_extnum_t        nexts,        /* number of extents max */
  319.     xfs_fsblock_t        *firstblock,    /* first allocated block
  320.                            controls a.g. for allocs */
  321.     xfs_bmap_free_t        *flist,        /* i/o: list extents to free */
  322.     int            *done);        /* set if not done yet */
  323.  
  324. /*
  325.  * Fcntl interface to xfs_bmapi.
  326.  */
  327. int                        /* error code */
  328. xfs_getbmap(
  329.     bhv_desc_t        *bdp,        /* XFS behavior descriptor*/
  330.     struct getbmap        *bmv,        /* user bmap structure */
  331.     void            __user *ap,    /* pointer to user's array */
  332.     int            iflags);    /* interface flags */
  333.  
  334. /*
  335.  * Check the last inode extent to determine whether this allocation will result
  336.  * in blocks being allocated at the end of the file. When we allocate new data
  337.  * blocks at the end of the file which do not start at the previous data block,
  338.  * we will try to align the new blocks at stripe unit boundaries.
  339.  */
  340. int
  341. xfs_bmap_isaeof(
  342.     struct xfs_inode    *ip,
  343.     xfs_fileoff_t        off,
  344.     int            whichfork,
  345.     char            *aeof);
  346.  
  347. /*
  348.  * Check if the endoff is outside the last extent. If so the caller will grow
  349.  * the allocation to a stripe unit boundary
  350.  */
  351. int
  352. xfs_bmap_eof(
  353.     struct xfs_inode        *ip,
  354.     xfs_fileoff_t           endoff,
  355.     int                     whichfork,
  356.     int                     *eof);
  357.  
  358. /*
  359.  * Count fsblocks of the given fork.
  360.  */
  361. int
  362. xfs_bmap_count_blocks(
  363.     xfs_trans_t        *tp,
  364.     struct xfs_inode    *ip,
  365.     int            whichfork,
  366.     int            *count);
  367.  
  368. /*
  369.  * Check an extent list, which has just been read, for
  370.  * any bit in the extent flag field.
  371.  */
  372. int
  373. xfs_check_nostate_extents(
  374.     xfs_bmbt_rec_t        *ep,
  375.     xfs_extnum_t        num);
  376.  
  377. #endif    /* __KERNEL__ */
  378.  
  379. #endif    /* __XFS_BMAP_H__ */
  380.